public class Test1 {
    // 定义一个方法，用于实现下一个排列的功能
    public static void nextPermutation(int[] nums) {
        // 如果数组长度小于等于1，则直接返回
        if (nums.length <= 1) {
            return;
        }

        /*寻找尽可能靠右的低位进行交换，从后向前查找*/
        // 定义三个指针i、j、k，分别指向数组中的倒数第二个元素、
        // 最后一个元素和倒数第一个元素
        int i = nums.length - 2, j = nums.length - 1, k = nums.length - 1;

        /*找到第一个“后面的大数”与“前面的小数”*/
        // 找到第一个满足 nums[i] < nums[j] 的位置
        while (i >= 0 && nums[i] >= nums[j]) {
            i--;
            j--;
        }

        /*我们希望增加的幅度尽可能的小，所以再次从后向前寻找
        * “尽可能小的大数”和前面找到的“前面的小数”进行交换
        * 当前已经满足nums[i]<nums[j]，那么nums[j+1]<nums[j]
        * 此时我们就是要在nums[j+1,len-1]之间，
        * 从后向前找到第一个大于nums[i]的数并交换*/
        // 如果不是最后一个排列，则找到第一个满足 nums[i] < nums[k] 的位置，
        // 并交换 nums[i] 和 nums[k]
        if (i >= 0) {
            while (nums[i] >= nums[k]) {
                k--;
            }
            int temp = nums[i];
            nums[i] = nums[k];
            nums[k] = temp;
        }

        // 将 j 到末尾的元素按照升序排列，使得整个数组变成下一个排列
        j = j;
        int end = nums.length - 1;
        while (j < end) {
            int temp = nums[j];
            nums[j] = nums[end];
            nums[end] = temp;
            j++;
            end--;
        }
    }

    // 主方法，用于测试下一个排列的实现
    public static void main(String[] args) {
        // 测试数据
        int[] nums = {1, 2, 3};
        // 调用下一个排列的实现方法
        nextPermutation(nums);
        // 打印结果
        for (int num : nums) {
            System.out.print(num + " ");
        }
    }
}